package com.foton.mybatis.handler.impl;

import com.foton.mybatis.handler.ResultSetHandler;
import com.foton.mybatis.model.MappedStatement;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author RenPu
 * @Date 2023/3/30 11:54
 * @Version 1.0
 * @Description:
 **/
public class DefaultResultSetHandler implements ResultSetHandler {

    private final MappedStatement mappedStatement;

    public DefaultResultSetHandler(MappedStatement mappedStatement) {
        this.mappedStatement = mappedStatement;
    }


    /**
     * 处理返回结果集，通过反射机制将返回结果集设置到返回实体类里
     * @param resultSet
     * @param <E>
     * @return
     */
    @Override
    public <E> List<E> handlerResultSets(ResultSet resultSet) {
        //创建返回对象类型的容器
        List<E> entityList = new ArrayList<>();
        try {
            //校验resultSet是否为null
            if (null == resultSet) {
                return null;
            }
            //进行迭代遍历
            while (resultSet.next()) {
                //通过反射获取返回对象类型对象
                Class<?> aClass = Class.forName(mappedStatement.getResultType());
                E entity = (E) aClass.newInstance();
                Field[] declaredFields = entity.getClass().getDeclaredFields();

                for (Field field : declaredFields) {
                    //设置可操作
                    field.setAccessible(true);
                    //根据类型进行匹配封装到返回对象里
                    if (String.class.equals(field.getType())) {
                        //之所以可以这样设置，因为表中的字段和实体类字段是一致的，
                        // 如果不一致这里需要对数据库字段和实体字段进行处理
                        field.set(entity, resultSet.getString(field.getName()));
                    } else if (int.class.equals(field.getType())) {
                        field.set(entity, resultSet.getInt(field.getName()));
                    } else {
                        //其他类型直接通过Object进行设置了
                        field.set(entity, resultSet.getObject(field.getName()));
                    }
                }
                //添加到容器进行返回
                entityList.add(entity);
            }
            return entityList;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}
